const fs = require('fs');
const path = require('path');
const crypto = require('crypto');

// 目标目录
const directoryPath = './';
// GLTF 文件路径
const gltfFilePath = './pinggaocity-1.gltf';

// 生成随机字符串
function generateRandomString(length) {
  return crypto.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);
}

// 读取 GLTF 文件内容
let gltfContent;
try {
  gltfContent = JSON.parse(fs.readFileSync(gltfFilePath, 'utf-8'));
} catch (error) {
  console.error('无法读取或解析 GLTF 文件:', error);
  process.exit(1);
}

// 存储文件名映射
const fileNameMapping = {};

// 遍历目录下的所有文件
fs.readdirSync(directoryPath).forEach(file => {
  if(!/\.(jpg|png)$/.test(file)){
    return
  }
  const filePath = path.join(directoryPath, file);
  if (fs.lstatSync(filePath).isFile()) {
    // 生成新的文件名
    const newFileName = `${generateRandomString(10)}${path.extname(file)}`;
    const newFilePath = path.join(directoryPath, newFileName);

    // 重命名文件
    fs.renameSync(filePath, newFilePath);

    // 记录文件名映射
    fileNameMapping[file] = newFileName;

    console.log(`文件 ${file} 已重命名为 ${newFileName}`);
  }
});

// 更新 GLTF 文件中的 URI 路径
Object.keys(fileNameMapping).forEach(oldName => {
  const newName = fileNameMapping[oldName];
  const oldUri = oldName.replace(/\\/g, '/');
  const newUri = newName.replace(/\\/g, '/');

  // 替换 images 和 buffers 中的 URI
  if (gltfContent.images) {
    gltfContent.images.forEach(image => {
      const oldName = decodeURIComponent(image.uri)
      console.log(oldName === oldUri, oldName, oldUri)

      if (oldName === oldUri) {
        console.log(oldName === oldUri, oldName, oldUri)
        image.uri = newUri;
      }
    });
  }

  if (gltfContent.buffers) {
    gltfContent.buffers.forEach(buffer => {
      const oldName = decodeURIComponent(buffer.uri)
      if (oldName === oldUri) {
        buffer.uri = newUri;
      }
    });
  }
});

// 写回更新后的 GLTF 文件
try {
  fs.writeFileSync(gltfFilePath, JSON.stringify(gltfContent, null, 2), 'utf-8');
  console.log('GLTF 文件已更新');
} catch (error) {
  console.error('无法写入 GLTF 文件:', error);
  process.exit(1);
}